home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / emulator / bsvc-1.000 / bsvc-1 / bsvc-1.0.4 / src / Sim68000 / cpu / instruction.c < prev    next >
C/C++ Source or Header  |  1995-07-26  |  4KB  |  171 lines

  1. /*
  2.  * instruction.c
  3.  *
  4.  * This program reads in an instruction definition file and builds the
  5.  * m68000DecodeTable.hxx file.  It checks the input to make sure that all
  6.  * instruction entries are distinguishable (if not an error is reported).
  7.  *
  8.  * Usage: instruction
  9.  *
  10.  * Sim68000 "Motorola 68000 Simulator"
  11.  * Copyright (c) 1993
  12.  * By: Bradford W. Mott
  13.  * November 3,1993
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19.  
  20. #define INFILE "instruction.list"
  21. #define OUTFILE "m68000DecodeTable.hxx"
  22.  
  23. typedef struct {
  24.   int mask;
  25.   int signature;
  26.   char *name;
  27.   char *gen;
  28. } Entry;
  29.  
  30. Entry table[4096];
  31.  
  32.  
  33. int Compare(const void *a,const void *b)
  34. {
  35.   /* return( strcmp( ((Entry*)a)->name, ((Entry*)b)->name ) ); */
  36.   return( ((Entry*)a)->signature - ((Entry*)b)->signature );
  37. }
  38.  
  39. unsigned int BinaryToInt(char *binary)
  40. {
  41.   int t,v;
  42.  
  43.   v=0;
  44.   for(t=0;t<strlen(binary);++t)
  45.   {
  46.     v=v<<1;
  47.     if(binary[t]=='1')
  48.       v=v|1;
  49.   }
  50.   return(v);
  51. }
  52.  
  53. int IsNotDistinct(char *a,char *b)
  54. {
  55.   int t,len;
  56.   char ta[80],tb[80];
  57.  
  58.   len=strlen(a);
  59.   if(strlen(b)<len)
  60.     len=strlen(b);
  61.  
  62.   strcpy(ta,a);
  63.   strcpy(tb,b);
  64.   for(t=0;t<len;++t)
  65.   {
  66.     if((ta[t]!='0') && (ta[t]!='1'))
  67.       tb[t]=ta[t];
  68.     else if((tb[t]!='0') && (tb[t]!='1'))
  69.       ta[t]=tb[t];
  70.   }
  71.  
  72.   for(t=0;t<len;++t)
  73.     if(ta[t]!=tb[t])
  74.       return(0);
  75.  
  76.   return(1);
  77. }
  78.  
  79. main()
  80. {
  81.   FILE *fp;
  82.   int num_of_entries;
  83.   char input[320],name[80],gen[80];
  84.   char mask[80],signature[80];
  85.   int t,s;
  86.  
  87.   fp=fopen(INFILE,"r");
  88.  
  89.   /* Read in table of instruction generators and names */
  90.   printf("\nReading '%s' file...\n",INFILE);
  91.   num_of_entries=0;
  92.   while(fgets(input,319,fp)!=NULL)
  93.   {
  94.      t=sscanf(input,"%s %s",gen,name);
  95.      if(t==2)
  96.      {
  97.        table[num_of_entries].name=(char*)malloc(strlen(name)+1);
  98.        table[num_of_entries].gen=(char*)malloc(strlen(gen)+1);
  99.        strcpy(table[num_of_entries].name,name);
  100.        strcpy(table[num_of_entries].gen,gen);
  101.        ++num_of_entries;
  102.      }
  103.      else if(t>0)
  104.      {
  105.        printf("Input Error: %d (%s)\n",t,input);
  106.        exit(-1);
  107.      }
  108.   }
  109.   fclose(fp);
  110.  
  111.   /* Compute the mask and signature values from the generator string */
  112.   printf("Computing mask and signature values...\n");
  113.   for(t=0;t<num_of_entries;++t)
  114.   {
  115.     for(s=0;s<strlen(table[t].gen);++s)
  116.     {
  117.       if((table[t].gen[s]=='0') || (table[t].gen[s]=='1'))
  118.       {
  119.         mask[s]='1';
  120.         signature[s]=table[t].gen[s];
  121.       }
  122.       else
  123.       {
  124.         mask[s]='0';
  125.         signature[s]='0';
  126.       }
  127.     }
  128.     mask[s]='\0';
  129.     signature[s]='\0';
  130.  
  131.     table[t].mask = BinaryToInt(mask);
  132.     table[t].signature = BinaryToInt(signature);
  133.   }
  134.   
  135.   /* Make sure all entries are distinct */
  136.   printf("Checking distinguishability...\n");
  137.   for(t=0;t<num_of_entries;++t)
  138.   {
  139.     for(s=0;s<num_of_entries;++s)
  140.     {
  141.       if(s!=t)
  142.       {
  143.         if(IsNotDistinct(table[t].gen,table[s].gen))
  144.         {
  145.           printf("ERROR: Entry ( %s , %s ) is not distinguishable\n",
  146.                  table[t].gen,table[t].name);
  147.           printf("       from entry ( %s , %s )!\n",table[s].gen,table[s].name);
  148.           exit(-1);
  149.         }
  150.       }
  151.     }
  152.   }
  153.  
  154.   printf("Sorting list...\n");
  155.   qsort((void*)table,num_of_entries,sizeof(Entry),Compare);
  156.  
  157.   /* Generate the instruction decode table */
  158.   printf("Writing '%s' file...\n\n",OUTFILE);
  159.   fp=fopen(OUTFILE,"w");
  160.   for(t=0;t<num_of_entries;++t)
  161.     if(t!=num_of_entries-1)
  162.       fprintf(fp,"  { 0x%04x, 0x%04x, &m68000::Execute%s },\n",
  163.              table[t].mask, table[t].signature, table[t].name);
  164.     else
  165.       fprintf(fp,"  { 0x%04x, 0x%04x, &m68000::Execute%s }\n",
  166.              table[t].mask, table[t].signature, table[t].name);
  167.  
  168.   fclose(fp);
  169.   exit(0);
  170. }
  171.